/*
 * @Author: mat
 * @Description: 对localStorage的封装
 */

const CryptoJS = require('crypto-js');
const storage = window.localStorage;
const key = CryptoJS.enc.Utf8.parse('7e^V9FLMatcyX0kA').toString();
const iv = CryptoJS.enc.Utf8.parse('kr6V%xV&tQj8kH13').toString();

export default {
	set(name, value) {
		if (typeof value === 'object') {
			value = JSON.stringify(value);
		} else {
			value = JSON.stringify({ myCacheValue: value });
		}
		// Triple DES 加密
		let encrypted = CryptoJS.TripleDES.encrypt(value.toString(), key, {
			iv: iv,
			mode: CryptoJS.mode.CBC,
			padding: CryptoJS.pad.Pkcs7,
		}).toString();
		storage.setItem(name, encrypted);
	},
	get(name) {
		let temp = storage.getItem(name);
		if (temp === null) {
			return null;
		}
		// Triple DES 解密
		let decrypted = CryptoJS.TripleDES.decrypt(temp, key, {
			iv: iv,
			mode: CryptoJS.mode.CBC,
			padding: CryptoJS.pad.Pkcs7,
		});
		// 转换为 utf8 字符串
		decrypted = CryptoJS.enc.Utf8.stringify(decrypted) || temp;
		let obj = JSON.parse(decrypted);
		if (obj.myCacheValue) {
			return obj.myCacheValue;
		}
		return obj;
	},
	clear(name) {
		if (name) {
			storage.removeItem(name);
		} else {
			storage.clear();
		}
	},
	clearExcept(array) {
		if (!array) {
			this.clear();
		} else {
			let temp = [];
			for (let i = 0; i < array.length; i++) {
				let val = this.get(array[i]);
				if (val) {
					temp.push({ name: array[i], val: val });
				}
			}
			this.clear();

			for (let i = 0; i < temp.length; i++) {
				this.set(temp[i].name, temp[i].val);
			}
		}
	},
};
